Inheritance

Inheritance means extending the properties of one class by another. Inheritance implies code reusability, because of which client classes do not need to implement everything from scratch. They can simply refer to their base classes to execute the code.

Unlike Java and C#, like C++, Python allows Multiple inheritance. Name resolution is done by the order in which the base classes are specified.

Syntax

class ClassName(BaseClass1[,BaseClass2,....,BaseClassN]):
        <statement 0>
        <statement 1>
        <statement 2>
        ...
        ...
        ...
        <statement n>

A First Example


In [3]:
class Person:
     
    # Constructor
    def __init__(self, name, age):
        self.name = name
        self.age = age
     
    def __str__(self):
        return 'name = {}\nage = {}'.format(self.name,self.age)
 
# Inherited or Sub class 
class Employee(Person):
    
    def __init__(self, name, age, employee_id):
        Person.__init__(self, name, age) # Referring Base class
        # Can also be done by super(Employee, self).__init__(name, age)
        self.employee_id = employee_id
 
    # Overriding implied code reusability
    def __str__(self):
        return Person.__str__(self) + '\nemployee id = {}'.format(self.employee_id)

In [4]:
s = Person('Kiran',18)
print(s)


name = Kiran
age = 18

In [6]:
e = Employee('Ramesh',18,48)
print(e)


name = Ramesh
age = 18
employee id = 48

**Note** Base class can be referred from derived class in two ways - Base Class name - `BaseClass.function(self,args)` - using `super()` - `super(DerivedClass, self).function(args)`

Multiple inheritance and Order of Invocation of Methods


In [7]:
class Base1:
    def some_method(self):
        print('Base1')
        
    
class Base2:
    def some_method(self):
        print('Base2')
        
class Derived1(Base1,Base2):
    pass

class Derived2(Base2,Base1):
    pass

Note how pass statement is used to leave the class body empty. Otherwise it would have raised a Syntax Error. Since Drived1 and Derived2 are empty, they would have imported the methods from their base classes


In [8]:
d1 = Derived1()
d2 = Derived2()

Now what will be the result of invoking some_method on d1 and d2? ... Does the name clash ocuur? ... Let's see


In [9]:
d1.some_method()


Base1

In [10]:
d2.some_method()


Base2

Wow! ... It executed smoothly ...

If a name of a function is same in base classes, the one will be executed, which appears first in the base class list